#ifndef PROTOCOL_H
#define PROTOCOL_H

// 包含必要的头文件
#include <cJSON.h>
#include <string>
#include <functional>
#include <chrono>

// 二进制协议3的结构体定义
struct BinaryProtocol3 {
    uint8_t type;  // 消息类型
    uint8_t reserved;  // 保留字段
    uint16_t payload_size;  // 负载大小
    uint8_t payload[];  // 负载数据
} __attribute__((packed));

// 中断原因枚举
enum AbortReason {
    kAbortReasonNone,  // 无中断
    kAbortReasonWakeWordDetected  // 检测到唤醒词
};

// 监听模式枚举
enum ListeningMode {
    kListeningModeAutoStop,  // 自动停止模式
    kListeningModeManualStop,  // 手动停止模式
    kListeningModeRealtime  // 实时模式（需要AEC支持）
};

// 协议基类
class Protocol {
public:
    virtual ~Protocol() = default;

    // 获取服务器采样率
    inline int server_sample_rate() const {
        return server_sample_rate_;
    }
    // 获取服务器帧时长
    inline int server_frame_duration() const {
        return server_frame_duration_;
    }
    // 获取会话ID
    inline const std::string& session_id() const {
        return session_id_;
    }

    // 设置回调函数
    void OnIncomingAudio(std::function<void(std::vector<uint8_t>&& data)> callback);  // 接收音频数据回调
    void OnIncomingJson(std::function<void(const cJSON* root)> callback);  // 接收JSON数据回调
    void OnAudioChannelOpened(std::function<void()> callback);  // 音频通道打开回调
    void OnAudioChannelClosed(std::function<void()> callback);  // 音频通道关闭回调
    void OnNetworkError(std::function<void(const std::string& message)> callback);  // 网络错误回调

    // 纯虚函数接口
    virtual void Start() = 0;  // 启动协议
    virtual bool OpenAudioChannel() = 0;  // 打开音频通道
    virtual void CloseAudioChannel() = 0;  // 关闭音频通道
    virtual bool IsAudioChannelOpened() const = 0;  // 检查音频通道是否打开
    virtual void SendAudio(const std::vector<uint8_t>& data) = 0;  // 发送音频数据

    // 虚函数接口
    virtual void SendWakeWordDetected(const std::string& wake_word);  // 发送唤醒词检测通知
    virtual void SendStartListening(ListeningMode mode);  // 发送开始监听通知
    virtual void SendStopListening();  // 发送停止监听通知
    virtual void SendAbortSpeaking(AbortReason reason);  // 发送中断说话通知
    virtual void SendIotDescriptors(const std::string& descriptors);  // 发送IoT描述符
    virtual void SendIotStates(const std::string& states);  // 发送IoT状态

protected:
    // 回调函数成员
    std::function<void(const cJSON* root)> on_incoming_json_;  // JSON数据接收回调
    std::function<void(std::vector<uint8_t>&& data)> on_incoming_audio_;  // 音频数据接收回调
    std::function<void()> on_audio_channel_opened_;  // 音频通道打开回调
    std::function<void()> on_audio_channel_closed_;  // 音频通道关闭回调
    std::function<void(const std::string& message)> on_network_error_;  // 网络错误回调

    // 协议参数
    int server_sample_rate_ = 24000;  // 服务器采样率
    int server_frame_duration_ = 60;  // 服务器帧时长（毫秒）
    bool error_occurred_ = false;  // 错误标志
    std::string session_id_;  // 会话ID
    std::chrono::time_point<std::chrono::steady_clock> last_incoming_time_;  // 最后接收时间

    // 保护方法
    virtual void SendText(const std::string& text) = 0;  // 发送文本消息
    virtual void SetError(const std::string& message);  // 设置错误信息
    virtual bool IsTimeout() const;  // 检查是否超时
};

#endif // PROTOCOL_H

